package com.thp.erp.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.thp.erp.dao.IBaseDao;

public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{
	
	
	private Class<T> entityClass;
	
	
	public BaseDao() {
		// 通过子类来获取父类
		Type baseDaoClass = this.getClass().getGenericSuperclass();
		// 转成参数化的类型
		ParameterizedType pType = (ParameterizedType) baseDaoClass;
		// 获取参数类型的数组
		Type[] types = pType.getActualTypeArguments();
		// 得到了泛型里的T的类型
		Type targetType = types[0];
		// 转换成class类型
		entityClass = (Class<T>) targetType;
	}
	
	
	
	
	
	/**
	 * 查询全部部门列表
	 */
	@Override
	public List<T> getList() {
		return (List<T>) getHibernateTemplate().find("from T");
	}

	/**
	 * 条件查询列表
	 * MatchMode.START：字符串在最前面的位置.相当于"like 'key%'"
	 * MatchMode.END：字符串在最后面的位置.相当于"like '%key'"
	 * MatchMode.ANYWHERE：字符串在中间匹配.相当于"like '%key%'"
	 * MatchMode.EXACT：字符串精确匹配.相当于"like 'key'"
	 */

	/**
	 * 条件查询  可以传递各种参数
	 */
	@Override
	public List<T> getList(T t1, T t2, Object param) {
		DetachedCriteria dc = getDetachedCriteria(t1, t2, param);
		
		return (List<T>) getHibernateTemplate().findByCriteria(dc);
	}
	
	
	/**
	 * 分页查询
	 */
	@Override
	public List<T> getListByPage(T t1, T t2, Object param, int firstResult, int maxResult) {
		DetachedCriteria dc = getDetachedCriteria(t1, t2, param);
		
		return (List<T>) getHibernateTemplate().findByCriteria(dc, firstResult, maxResult);
	}

	@Override
	public long getCount(T t1, T t2, Object param) {
		DetachedCriteria dc = getDetachedCriteria(t1, t2, param);
		
		dc.setProjection(Projections.rowCount());
		List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
		return list.get(0);
	}
	
	
	

	@Override
	public void add(T t) {
		getHibernateTemplate().save(t);
	}
	
	
	
	/**
	 * 根据部门ID删除部门
	 */
	@Override
	public void delete(Long id) {
		// 先根据部门ID从数据库中查询该部门  然后再删除
		getHibernateTemplate().delete(getHibernateTemplate().get(entityClass, id));
	}

	/**
	 * 根据部门ID查询部门实体信息
	 */
	@Override
	public T get(Long id) {
		return getHibernateTemplate().get(entityClass, id);
	}

	
	// 修改部门信息
	@Override
	public void update(T t) {
		getHibernateTemplate().update(t);
	}

	/**
	 * 根据id批量删除部门
	 */
	@Override
	public void deleteByIds(long[] ids) {
	
		String idsStr = "";
		for(int i = 0; i < ids.length; i++) {
			idsStr += i != ids.length - 1 ? ids[i] + "," : ids[i];
		}
		System.out.println("TDao:idsStr");
		System.out.println(idsStr);
		List<T> list = (List<T>) getHibernateTemplate().find("from T where uuid in (" + idsStr + ")");
		
		// getHibernateTemplate().delete("from T where uuid in (" + idsStr + ")");
		getHibernateTemplate().deleteAll(list);
	}

	

	/*
	 * 构建离线查询条件 需要子类去实现 
	 */
	public DetachedCriteria getDetachedCriteria(T t1, T t2, Object param) {
		return null;
	}

	
}
